//package com.plian.system.service.pm.listedcompany.impl;
//
//import com.alibaba.fastjson.JSON;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.plian.Tools.*;
//import com.plian.Tools.pagedata.PageData;
//import com.plian.system.cache.UserCache;
//import com.plian.system.common.status.CheckStatus;
//import com.plian.system.constant.sys.FormStatusConstant;
//import com.plian.system.constant.sys.FormTypeConstant;
//import com.plian.system.constant.yth.YthConstant;
//import com.plian.system.entity.pm.listedcompany.ListedMajorEvent;
//import com.plian.system.entity.sys.ApprovalMessage;
//import com.plian.system.mapper.pm.listedcompany.ListedMajorEventMapper;
//import com.plian.system.mybatis.base.BaseFlowService;
//import com.plian.system.mybatis.base.BaseServiceImpl;
//import com.plian.system.mybatis.support.Condition;
//import com.plian.system.service.pm.listedcompany.IListedMajorEventService;
//import com.plian.system.service.sys.code.IFormCodeService;
//import com.plian.system.service.sys.file.FileService;
//import com.plian.system.service.sys.message.IApprovalMessageService;
//import com.plian.system.service.sys.orgzation.IOrgService;
//import com.plian.system.service.wf.FormWorkflowService;
//import com.plian.system.vo.pm.listedcompany.ListedMajorEventVO;
//import com.plian.system.vo.yth.YthResult;
//import com.plian.system.wrapper.pm.listedcompany.ListedMajorEventWrapper;
//import lombok.AllArgsConstructor;
//import org.apache.commons.lang.exception.ExceptionUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.*;
//import java.util.stream.Collectors;
//
//import static com.plian.system.constant.sys.ApprovalMessageTypeConstant.GZW_TYPE;
//import static com.plian.system.constant.sys.FormStatusConstant.UNREVIEWED;
//
///**
// * @Author: Take-off
// * @Description: TODO
// * @Date: 2023/2/24 3:50 PM
// * @Param
// * @return
// * @Version: 1.0
// **/
//@Service
//@AllArgsConstructor
//public class ListedMajorEventServiceImpl extends BaseServiceImpl<ListedMajorEventMapper, ListedMajorEvent> implements IListedMajorEventService, BaseFlowService {
//
//    private final FormWorkflowService formWorkflowService;
//
//    private final IFormCodeService formCodeService;
//
//    private final ListedMajorEventWrapper listedMajorEventWrapper;
//
//    private final FileService fileService;
//
//    private IOrgService orgService;
//
//    private IApprovalMessageService approvalMessageService;
//    @Override
//    public boolean saveOrUpdate(ListedMajorEvent listedMajorEvent) {
//        boolean flag = false;
//        if (!Optional.ofNullable(listedMajorEvent.getStatus()).isPresent()) {
//            listedMajorEvent.setStatus(FormStatusConstant.UNREVIEWED);
//        }
//        if (listedMajorEvent.getStatus().equals(FormStatusConstant.REJECT)) {
//            listedMajorEvent.setStatus(FormStatusConstant.UNREVIEWED);
//        }
//        if (!Optional.ofNullable(listedMajorEvent.getId()).isPresent()) {
//            flag = true;
//            listedMajorEvent.setCode(formCodeService.getCode(FormTypeConstant.QM_LISTED_MAJOR_EVENT));
//            listedMajorEvent.setFormType(String.valueOf(FormTypeConstant.QM_LISTED_MAJOR_EVENT));
//        }
//        boolean result = super.saveOrUpdate(listedMajorEvent);
//        if (flag){
//            fileService.saveAll(String.valueOf(listedMajorEvent.getId()), listedMajorEvent.getDocList());
//        }else {
//            fileService.edit(String.valueOf(listedMajorEvent.getId()), listedMajorEvent.getDocList());
//        }
//        if (StringUtil.isNotBlank(listedMajorEvent.getAttachIds())){
//            fileService.upYthFile(listedMajorEvent.getAttachIds(),String.valueOf(listedMajorEvent.getId()));
//        }
//        return result;
//    }
//
//    @Override
//    public ListedMajorEventVO getDetailObj(ListedMajorEvent listedMajorEvent) {
//        ListedMajorEvent detail = getOne(Condition.getQueryWrapper(listedMajorEvent));
//        ListedMajorEventVO listedMajorEventVO = listedMajorEventWrapper.entityToVO(detail);
//        return listedMajorEventVO;
//    }
//
//    @Override
//    @Transactional(rollbackFor=RuntimeException.class)
//    public boolean deleteLogic(List<Long> ids) {
//        for (Long id : ids) {
//            ListedMajorEvent listedMajorEvent = getById(id);
//            if (listedMajorEvent == null) {
//                return false;
//            } else if (listedMajorEvent.getStatus() != null &&
//                    (listedMajorEvent.getStatus() != FormStatusConstant.STASH && listedMajorEvent.getStatus() != FormStatusConstant.UNREVIEWED)) {
//                return false;
//            }
//            formWorkflowService.deleteProcessInstance(String.valueOf(id));
//        }
//        return super.deleteLogic(ids);
//    }
//
//    @Override
//    public HashMap<String,Object> commit(String id) {
//        handleStatus(Long.valueOf(id), FormStatusConstant.FLOW,"");
//
//        //将需要提交的流程变量返回，用于工作流侧
//        return new HashMap<String,Object>();
//    }
//
//    @Override
//    public Boolean finish(String id) {
//        return handleStatus(Long.valueOf(id), FormStatusConstant.FINISH,"审批通过");
//    }
//
//    @Override
//    public Boolean reject(String id, int formState,String comment) {
//        return handleStatus(Long.valueOf(id), formState,comment);
//    }
//
//    @Override
//    public List<PageData> findByIds(List<String> formIds) {
//        LambdaQueryWrapper<ListedMajorEvent> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.in(ListedMajorEvent::getId, Func.toLongList(StringUtils.join(formIds, StringPool.COMMA)));
//        List<ListedMajorEvent> listedMajorEvents = list(queryWrapper);
//        List<ListedMajorEventVO> listedMajorEventVOS = listedMajorEventWrapper.entityToVO(listedMajorEvents);
//        List<PageData> pageDataList = new ArrayList<>();
//        try{
//            if (CollectionUtil.isNotEmpty(listedMajorEventVOS)){
//                for (ListedMajorEventVO vo : listedMajorEventVOS){
//                    PageData pd = new PageData();
//                    pd.put("id", vo.getId());
//                    pd.put("UNITNAME", vo.getCreateCompanyName());
//                    pd.put("APPLICANTNAME", vo.getCreateUserName());
//                    pd.put("applicantId", vo.getCreateUser());
//                    pd.put("applyOrganizationId", vo.getCreateCompanyId());
//                    pd.put("formType", FormTypeConstant.QM_LISTED_MAJOR_EVENT);
//                    pd.put("orgName", vo.getCreateCompanyName());
//                    pageDataList.add(pd);
//                }
//            }
//
//            return pageDataList;
//        } catch (Exception e) {
//            log.error(ExceptionUtils.getFullStackTrace(e));
//        }
//        return pageDataList;
//    }
//
//    @Override
//    public List<Integer> getFormType() {
//        return Arrays.asList(FormTypeConstant.QM_LISTED_MAJOR_EVENT);
//    }
//
//    @Override
//    public void goBackToStash(String formId) {
//        handleStatus(Long.valueOf(formId), UNREVIEWED, null);
//    }
//
//    /**
//     * 统一处理状态机事件方法
//     *
//     * @param id          主键
//     * @param updateStatus  更新状态
//     * @return boolean
//     */
//    private Boolean handleStatus(Long id, int updateStatus, String comment) {
//        try {
//            ListedMajorEvent listedMajorEvent = getById(id);
//            /**
//             * 设置审批人和审批时间
//             */
//            if (updateStatus == FormStatusConstant.FINISH){
//                listedMajorEvent.setApprovedUser(TokenUtil.getTokenUserId());
//                Date now = DateUtil.now();
//                listedMajorEvent.setApprovedTime(now);
//            }
//            if (StringUtil.isNotBlank(listedMajorEvent.getDataSource()) &&
//                    StringUtil.isNotBlank(listedMajorEvent.getDataSourceId())){
//                if (updateStatus == FormStatusConstant.FINISH || updateStatus == FormStatusConstant.REJECT){
//                    ApprovalMessage approvalMessage = new ApprovalMessage();
//                    approvalMessage.setDataSourceId(listedMajorEvent.getDataSourceId());
//                    approvalMessage.setOpinion(comment);
//                    approvalMessage.setIsApprove(updateStatus == FormStatusConstant.FINISH ? 2 : 1);
//                    approvalMessage.setIsSend(1);
//                    approvalMessage.setDataSourceType(GZW_TYPE);
//
//                    if (listedMajorEvent.getDataSource().equals(YthConstant.DATA_NINGBO)) {
//                        approvalMessage.setDataSourceType(YthConstant.DATA_NINGBO);
//                        approvalMessage.setFilingUserName(UserCache.userIdToName(TokenUtil.getTokenUserId()));
//                        approvalMessage.setFormType(FormTypeConstant.QM_LISTED_MAJOR_EVENT);
//                        approvalMessage.setFilingCode(listedMajorEvent.getCode());
//                    }
//                    approvalMessageService.save(approvalMessage);
//                }
//            }
//            listedMajorEvent.setStatus(updateStatus);
//            updateById(listedMajorEvent);
//            return true;
//        } catch (Exception e) {
//            log.error(ExceptionUtils.getFullStackTrace(e));
//            return false;
//        }
//    }
//
//    @Override
//    @Transactional(rollbackFor = RuntimeException.class)
//    public String saveListedMajorEvents(String data){
//        YthResult ythResult = new YthResult();
//        //成功的id集合
//        List<String> successIds = new ArrayList<>();
//        //失败的id集合
//        List<String> failIds = new ArrayList<>();
//        //失败的原因
//        List<String> failReasons = new ArrayList<>();
//        //将json字符串转换成list
//        List<ListedMajorEvent> listedMajorEvents = JSON.parseArray(data, ListedMajorEvent.class);
//        //判断list是否为空
//        if (CollectionUtil.isNotEmpty(listedMajorEvents)){
//            //组织map
//            Map<String, String> orgSourceMap = orgService.getSourceId();
//
//            //根据datasourceIds 查询出所有的数据
//            List<ListedMajorEvent> list = list(new LambdaQueryWrapper<ListedMajorEvent>().in(ListedMajorEvent::getDataSourceId, listedMajorEvents.stream()
//                    .map(ListedMajorEvent::getDataSourceId).toArray()));
//            //如果数据库中有数据，就更新，没有就新增
//            for (ListedMajorEvent listedMajorEvent:listedMajorEvents) {
//                String dataSourceId = listedMajorEvent.getDataSourceId();
//                transfer(listedMajorEvent,orgSourceMap);
//                if (CollectionUtil.isNotEmpty(list)){
//                    List<String> olIds = list.stream().map(ListedMajorEvent::getDataSourceId).collect(Collectors.toList());
//                    //判断数据库中是否有数据
//                    if (olIds.contains(dataSourceId)){
//                        for (ListedMajorEvent event:list) {
//                            if (dataSourceId.equals(event.getDataSourceId())) {
//                                if (CheckStatus.checkCode(event.getStatus())) {
//                                    successIds.add(dataSourceId);
//                                    listedMajorEvent.setId(event.getId());
//                                    listedMajorEvent.setDataSource(YthConstant.DATA_NINGBO);
//                                    saveOrUpdate(listedMajorEvent);
//                                    list.remove(event);
//                                    break;
//                                }else {
//                                    failIds.add(dataSourceId);
//                                    failReasons.add("dataSourceId:"+dataSourceId+"数据已提交且已经在流程中，无法更新");
//                                    break;
//                                }
//                            }
//                        }
//                    }else {
//                        //如果数据库中没有数据，就新增
//                        listedMajorEvent.setDataSource(YthConstant.DATA_NINGBO);
//                        saveOrUpdate(listedMajorEvent);
//                        successIds.add(listedMajorEvent.getDataSourceId());
//                    }
//                }else {
//                    //如果数据库中没有数据，就新增
//                    listedMajorEvent.setDataSource(YthConstant.DATA_NINGBO);
//                    saveOrUpdate(listedMajorEvent);
//                    successIds.add(listedMajorEvent.getDataSourceId());
//                }
//            }
//        } else {
//            failReasons.add("数据为空");
//        }
//        ythResult.setSuccessIds(successIds);
//        ythResult.setFailIds(failIds);
//        ythResult.setFailReason(StringUtils.join(failReasons, ";"));
//        //ythResult转换成json字符串
//        return JSON.toJSONString(ythResult);
//    }
//
//    private void transfer(ListedMajorEvent listedMajorEvent,Map<String, String> orgSourceMap){
//        Optional.ofNullable(listedMajorEvent.getUnitId()).ifPresent(m ->
//                {
//                    String orgId = orgSourceMap.get(m);
//                    listedMajorEvent.setUnitId(orgId);
//                    listedMajorEvent.setCreateCompanyId(orgId);
//                }
//        );
//
//    }
//
//
//}
